package com.example.chinesenation.Utils;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.chinesenation.Entity.*;
import com.example.chinesenation.Redis.RedisService;
import com.example.chinesenation.Service.*;
import com.example.chinesenation.VO.MainPage.VOArticleList;
import com.example.chinesenation.VO.MainPage.VOPolicyList;
import com.example.chinesenation.VO.NationPage.VONationArticle;
import com.example.chinesenation.VO.keyWordJSONObject;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;

import javax.annotation.PostConstruct;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Collectors;


/**
 * @author sakuraFallingDown
 * @version 1.0
 * @date 2021/2/6 18:54
 * "民族人物"					"187"
 * "民族体育"					"177"
 * "民族医药"					"1075"
 * "民族工艺"					"410"
 * "民族建筑"					"151"
 * "民族文化"					"694"
 * "民族文艺"					"231"
 * "民族旅游"					"179"
 * "民族自制"					"76"
 * "民族饮食"					"405"
 * 目前具体分类如下
 *
 * *民族信息大模块
 * [民族旅游, 民族自治, 民族文化, 民族医药, 民族饮食, 民族人物, 民族工艺, 民族建筑, 民族文艺, 民族体育]
 *
 * 每个模块细分如下
 * {民族自治=[民族自治区, 民族自治州],
 * 民族体育=[民族武术, 体育项目, 体育文化, 体育资讯],
 * 民族文化=[民族文学, 民族风情, 民族节日, 民族传说, 民族历史, 民族风俗, 民族趣闻, 民族语言, 民族宗教, 民族敬忌],
 * 民族医药=[其他民族医药, 傣医, 蒙医, 藏医, 回医, 朝医, 彝医, 壮医, 维医, 土医, 瑶医],
 * 民族人物=[民族工艺师, 民族专家学者, 民族企业家, 民族政治家, 民族书画家, 人物资讯, 民族歌唱家, 民族科学家],
 * 民族工艺=[民间工艺, 玉器工艺, 工艺文化, 工艺精品, 雕刻工艺, 工艺知识, 工艺资讯, 民族服饰, 陶器工艺, 工艺人物, 绘画工艺, 工艺会展],
 * 民族旅游=[旅行社, 民俗旅游, 民族古迹, 旅游活动, 旅游信息, 推荐景点, 古镇推荐, 民族之旅, 推荐地区, 旅游路线, 出行宝典],
 * 民族文艺=[民族舞蹈, 民族音乐, 民族乐器, 文艺知识],
 * 民族建筑=[民族家居, 建筑资讯, 建筑文化, 特色建筑],
 * 民族饮食=[风味小吃, 饮食文化, 民族美食, 民族菜, 民族特产, 民族药膳, 食客发现, 地方餐馆, 美食图片, 饮食资讯]}
 */
@Configuration
public class NationTools {//民族模块的工具类

    @Autowired
    private RedisService redisService;
    @Autowired
    INationCategoryService nationCategoryService;
    @Autowired
    INationModuleService nationModuleService;

    @Autowired
    IArticleClassicalService articleClassicalService;
    @Autowired
    IArticleService articleService;


    private  List<String> categoryName=new ArrayList<>();
    private  HashMap<String,List<String>> moduleName=new HashMap<>();

    @PostConstruct
    void nationUtil(){

        if(redisService!=null){
            categoryName=(List<String>)redisService.get(CommonURL.CategoryRedis);
            moduleName=(HashMap<String,List<String>>)redisService.get(CommonURL.ModuleRedis);
        }
        if(categoryName==null||categoryName.size()==0
                ||moduleName==null||moduleName.size()==0){
            if(addIntoRedisForCategoryAndModule()){
                categoryName=(List<String>)redisService.get(CommonURL.CategoryRedis);
                moduleName=(HashMap<String,List<String>>)redisService.get(CommonURL.ModuleRedis);
            }
        }
    }
    private boolean addIntoRedisForCategoryAndModule(){
        HashMap<String,List<String>> moduleMap=new HashMap<>();
        List<NationCategory> list = nationCategoryService.list();
        List<String> categoryList = list.stream().map(NationCategory::getName).collect(Collectors.toList());
        redisService.put(CommonURL.CategoryRedis,categoryList);
        List<NationModule> nationModuleList = nationModuleService.list();
        categoryList.forEach(str->{
            List<String> collect1 = nationModuleList.stream().filter(nationModule -> {
                return nationModule.getCategoryName().equals(str);
            }).map(NationModule::getModuleName).collect(Collectors.toList());
            moduleMap.put(str,collect1);
        });
        redisService.put(CommonURL.ModuleRedis,moduleMap);
        return redisService.hasKey(CommonURL.CategoryRedis)&&redisService.hasKey(CommonURL.ModuleRedis);
    }

    public List<String> getCategoryName() {
        return categoryName;
    }
    public HashMap<String, List<String>> getModuleName() {
        return moduleName;
    }

    public List<VONationArticle> getNationHotArticle(String nationName){

        QueryWrapper<ArticleClassical> qw = new QueryWrapper<>();
        qw.eq("nation_name", nationName);
        List<ArticleClassical> list1 = articleClassicalService.list(qw);
        List<String> collect1 = list1.stream().map(ArticleClassical::getArticleId).collect(Collectors.toList());
        List<Article> articles = articleService.listByIds(collect1);
        List<VONationArticle> voNationArticleList = articles.stream().map(article -> {
            VONationArticle voNationArticle = new VONationArticle();
            DataChanges.fromArticleToVONationArticle(article, voNationArticle);
            return voNationArticle;
        }).collect(Collectors.toList());
        if(voNationArticleList!=null&&voNationArticleList.size()!=0) {
            redisService.put(CommonURL.NationPageRecommend + nationName, voNationArticleList);
        }
        return voNationArticleList;
    }

}
